package com.order.manager.controller.Img;

import com.order.manager.Model.UploadImgInfo;
import com.order.manager.Model.other.RestBean;
import com.order.manager.service.impl.UploadImgInfoServiceImpl;
import com.order.manager.util.ImageUtil;
import com.order.manager.util.JedisUtil;
import com.order.manager.util.JwtUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;

/**
 * 图片上传控制器
 * 处理图片上传、存储及相关信息管理
 */
@RestController
@RequestMapping("/api/upload")
@Slf4j
public class UploadController {

    // 注入图片上传信息服务，用于操作数据库
    @Resource
    UploadImgInfoServiceImpl uploadImgInfoService;

    // 注入JWT工具类，用于解析用户身份信息
    @Resource
    JwtUtil jwtUtil;

    // 注入Jedis工具类（当前未使用，可能用于缓存）
    @Resource
    JedisUtil jedisUtil;

    // 从配置文件中获取图片存储位置
    @Value("${img.position}")
    String imgPosition;

    // 从配置文件中获取服务器地址（用于生成图片访问URL）
    @Value("${location.port}")
    String serverAddress;

    /**
     * 普通图片上传接口
     * @param file 上传的文件对象
     * @param request HTTP请求对象（用于获取用户JWT）
     * @return 操作结果：成功返回图片访问URL，失败返回错误信息
     */
    @PostMapping("/img")
    public RestBean upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        // 从请求头JWT中获取用户ID
        String jwtUUID = jwtUtil.getJwtUsername(request);
        log.info(jwtUUID);  // 记录用户ID

        // 创建图片上传信息实体
        UploadImgInfo uploadImgInfo = new UploadImgInfo();
        try {
            // 检查文件是否为空
            if (file.isEmpty()) {
                return RestBean.failure(400, "上传的文件为空");
            }

            // 获取原始文件名
            String originalFileName = file.getOriginalFilename();
            uploadImgInfo.setImgName(originalFileName);  // 设置文件名

            // 检查文件名有效性
            if (originalFileName == null || originalFileName.isEmpty()) {
                return RestBean.failure(400, "文件名无效");
            }

            // 获取文件扩展名
            String fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));
            // 生成UUID作为新文件名前缀
            String uuid = UUID.randomUUID().toString();
            // 组合新文件名（UUID+扩展名）
            String newFileName = uuid + fileExtension;

            // 设置文件大小（字节）
            uploadImgInfo.setImgSize((double) file.getSize());
            // 设置上传时间
            uploadImgInfo.setInputTime(new Date());
            // 设置上传用户ID
            uploadImgInfo.setUserId(jwtUUID);

            // 组合文件存储路径（配置路径+新文件名）
            String filePath = imgPosition + newFileName;
            // 创建存储目录对象
            File directory = new File(imgPosition);
            // 若目录不存在则创建（最多创建多级目录）
            if (!directory.exists() && (!directory.mkdirs())) {
                return RestBean.failure(500, "文件夹初始化失败");
            }

            // 保存文件到服务器
            file.transferTo(new File(filePath));
            log.info("文件保存成功，路径：" + filePath);  // 记录存储路径

            // 生成图片访问URL（服务器地址+文件路径）
            String url = "http://" + serverAddress + "/img/" + newFileName;
            log.info("http://" + serverAddress + "/img/" + newFileName);  // 记录访问URL

            // 设置图片访问地址
            uploadImgInfo.setImgHref(url);
            // 保存上传信息到数据库
            uploadImgInfoService.save(uploadImgInfo);

            // 返回成功响应及图片URL
            return RestBean.success(url);
        } catch (IOException e) {
            log.error("文件保存失败：" + e.getMessage());  // 记录错误日志
            return RestBean.failure(500, "文件保存失败");
        }
    }

    /**
     * 带图片处理的上传接口（可能包含缩放）
     * @param file 上传的文件对象
     * @param request HTTP请求对象（用于获取用户JWT）
     * @return 操作结果：成功返回图片访问URL，失败返回错误信息
     */
    @PostMapping("/img-d")
    public RestBean Dupload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        // 从请求头JWT中获取用户ID
        String jwtUUID = jwtUtil.getJwtUsername(request);
        log.info(jwtUUID);  // 记录用户ID

        // 创建图片上传信息实体
        UploadImgInfo uploadImgInfo = new UploadImgInfo();
        try {
            // 检查文件是否为空
            if (file.isEmpty()) {
                return RestBean.failure(400, "上传的文件为空");
            }

            // 获取原始文件名
            String originalFileName = file.getOriginalFilename();
            uploadImgInfo.setImgName(originalFileName);  // 设置文件名

            // 检查文件名有效性
            if (originalFileName == null || originalFileName.isEmpty()) {
                return RestBean.failure(400, "文件名无效");
            }

            // 获取文件扩展名
            String fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));
            // 生成原始图片存储路径（带标记）
            String originImg = imgPosition + "origin:" + UUID.randomUUID().toString() + fileExtension;
            // 生成处理后图片文件名（UUID+扩展名）
            String newFileName = UUID.randomUUID().toString() + fileExtension;

            // 设置文件大小（字节）
            uploadImgInfo.setImgSize((double) file.getSize());
            // 设置上传时间
            uploadImgInfo.setInputTime(new Date());
            // 设置上传用户ID
            uploadImgInfo.setUserId(jwtUUID);

            // 组合处理后图片存储路径
            String filePath = imgPosition + newFileName;
            // 创建存储目录对象
            File directory = new File(imgPosition);
            // 若目录不存在则创建
            if (!directory.exists() && (!directory.mkdirs())) {
                return RestBean.failure(500, "文件夹初始化失败");
            }

            // 先保存原始图片
            file.transferTo(new File(originImg));
            // 调用图片处理工具类进行缩放（0.2表示缩放比例）
            ImageUtil.imgScale(originImg, filePath, 0.2);
            log.info("文件保存成功，路径：" + filePath);  // 记录处理后图片路径

            // 生成图片访问URL
            String url = "http://" + serverAddress + "/img/" + newFileName;
            log.info("http://" + serverAddress + "/img/" + newFileName);  // 记录访问URL

            // 设置图片访问地址
            uploadImgInfo.setImgHref(url);
            // 保存上传信息到数据库
            uploadImgInfoService.save(uploadImgInfo);

            // 返回成功响应及图片URL
            return RestBean.success(url);
        } catch (IOException e) {
            log.error("文件保存失败：" + e.getMessage());  // 记录错误日志
            return RestBean.failure(500, "文件保存失败");
        }
    }
}